package com.mercycrazy.recruit.rabbit;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static com.mercycrazy.recruit.constant.RabbitMQConstant.*;

/**
 * rabbitmq 发短信相关配置
 *
 * @author <a href="mailto:1443424326@qq.com">mercycrazy</a>
 * @since 2023-01-19
 */
@Configuration
public class RabbitMQSMSConfig {

    /**
     * 创建交换机
     */
    @Bean(SMS_EXCHANGE)
    public Exchange exchange() {
        return ExchangeBuilder
                .topicExchange(SMS_EXCHANGE)
                .durable(true)
                .build();
    }

    /**
     * 创建队列
     */
    @Bean(SMS_QUEUE)
    public Queue queue() {
        return QueueBuilder
                .durable(SMS_QUEUE)
                // 设置整个队列的 ttl, 单位: 毫秒
                // 注意: 该参数只能在队列创建时设置, 如果设置时队列已创建, 需要删除队列重新设置
                .withArgument("x-message-ttl", 20 * 1000)
                // 配置队列对应的死信交换机和死信 routing key
                // 满足以下三种情况的皆会进入死信队列:
                // 1. ttl 超时
                // 2. 手动 nack
                // 3. 超过队列消息最大的长度限制
                .withArgument("x-dead-letter-exchange",
                        SMS_EXCHANGE_DEAD)
                .withArgument("x-dead-letter-routing-key",
                        SMS_LOGIN_SEND_ROUTING_DEAD)
                // 设置队列的最大消息容量
//                .withArgument("x-max-length", 100)
                .build();
    }

    /**
     * 定义队列绑定到交换机的关系
     */
    @Bean
    public Binding smsBinding(
            @Qualifier(SMS_EXCHANGE) Exchange exchange,
            @Qualifier(SMS_QUEUE) Queue queue
    ) {
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with(SMS_ROUTING)
                .noargs();
    }
}
